package auctionatr

import java.util.Date;

/**
 * Die Klasse Auction definiert die Attribute jeder Auktion.
 * Jede Auktion ist genau dem User zugewiesen, von dem sie erstellt wird.
 * 
 * @author Can Paul
 *
 */

class Auction{
	
	
	/** 
	 * Beim Anlegen einer Auktion müssen gewisse Eingabebedingungen erfüllt sein. Die Validierung erfolgt mithilfe der constraints. 
	 *  
	 * @name Dieses Feld ist ein Pflichtfeld und muss ausgefüllt werden.
	 * @description Dieses Feld muss nicht ausgefüllt werden.
	 * @finishDate Als Enddatum muss ein Tag in der Zukunft gewählt werden.
	 * @startPrice Dieses Feld ist ein Pflichtfeld und muss ausgefüllt werden. Der Mindeststartpreis beträgt EUR 1,00.
	 * @state Der Zustand des Artikels muss zwischen "gebraucht", "wie neu" und "neu" gewählt werden.
	 * @shipment Die Versandart muss zwischen "UPS", "Post", "Hermes","Abholung" und "DHL" gewählt werden.
	 * @category Der Artikel muss einer Kategorie aus "Bücher", "Musik/DVD/Games", "Computer und Software", "Elektronik und Foto", "Küche und Haushalt", "Baumarkt", "Auto und Motorrad", "Lebensmittel und Drogerie", "Kindersachen", "Kleidung und Accessoires" oder "Sport und Freizeit" zugewiesen werden.
	 * @deliveryCosts Die Versandkosten müssen durch den Auktionsersteller festgelegt werden. Der Versand kann auch kostenlos sein.
	 * @picture Das Auktionsbild darf eine Bildgröße von maximal 500 KB besitzen.
	 *  
	 */
    static constraints = {	
		name(blank:false,maxSize:40)
		description()
		finishDate(blank:false ,validator: {return (it > new Date())})
		startPrice(blank:false,min:1.0,scale:2)			// Startpreis auf 1,00 festgelegt -> je nach Kundenwunsch anpassen	
		
		state(blank:false,inList:["gebraucht","wie neu","neu"])
		shipment(blank:false,inList:["UPS","Post","Hermes","Abholung", "DHL"])
		
		dateCreated(display:false)
		
		deliveryCosts(blank:false,min:0.0)
		picture(nullable:true, maxSize:500000) //PF: Obergrenze für die Bildgröße, erst einmal willkürlich und Subject to change!
		pictureType(nullable:true)
		completed(display: false)
    }	
	/** Eine Auktion kann mehrere Gebote besitzen.  */
	static hasMany = [bids : Bid]
	
	static mapping = {
        bids lazy: false
    }

	
	/** Eine Auktion wird genau einem User zugewiesen, und zwar dem, der sie erstellt. 
	 *  Eine Auktion gehört zu genau einer Kategorie. 
	 */
	static belongsTo = [users: User, categories: Category]
	
	/** Der Startpreis einer Auktion. */
	BigDecimal startPrice = 1.00

	/** Der Name der Auktion. */
	String name
	
	/** Die Auktionsbeschreibung. */
	String description

	/** Zeigt an, ob Auktion vollständig abgewickelt ist, d.h. inkl. Mailversand */
	Boolean completed = false
	
	/** Das Startdatum ist der Zeitpunkt, an dem die Auktion erstellt wurde */
	Date dateCreated
	
	/** Das Enddatum ist der Zeitpunkt, an dem die Auktion endet. */
	Date finishDate
	
	/** Diese Variable gibt an, ob die Auktion beendet ist oder noch läuft. */
	boolean isFinished
	
	/** Zustand des Artikels */
	String state
	
	/** Versandart */
	String shipment
	
	/** Kategorie */
	// String category
	
	/** Versandkosten */
	BigDecimal deliveryCosts = 0.0
	
	/** Auktionsbild */
	byte[] picture
	
	/** Gibt den Typ des Bildes als String an. */
	String pictureType
	
	/** Gibt den Auktionsnamen als String zurück. */
	String toString() {
		return "${name}"		
    }	
	
	/**
	 * Gibt den Status der Auktion als Boolean-Wert zurück.
	 * @return true, falls Auktion beendet; false, falls Auktion noch läuft.
	 */
	boolean isOver(){
		if(new Date() > finishDate){
			isFinished = true } else { isFinished = false
		}
		return isFinished
	}
	
	/**
	 * Ermöglicht es dem Grails-Plugin "Searchable", die Inhalte im Volltext zu durchsuchen
	 */
	static searchable = { except = ['categories', 'finished']}
	
	/**
	 * Die als "transients" aufgelisteten Variablen werden nicht in der Datenbank abgespeichert.
	 */
	static transients = ['over']
}
